home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / TOSIO.I < prev    next >
Encoding:
Modula Implementation  |  1990-11-10  |  4.1 KB  |  162 lines

  1. IMPLEMENTATION MODULE TOSIO;
  2. (*$B+,Y+,S-,M-,R-*)
  3.  
  4. (*
  5.  * Treibermodul.
  6.  *
  7.  * Näheres siehe Definitions-Text
  8.  *
  9.  * Durch Setzen von 'ConfirmClose' auf TRUE wird erreicht, daß
  10.  * beim Ende des damit gelinkten Programms auf einen Tastendruck
  11.  * gewartet wird.
  12.  *)
  13.  
  14. FROM SYSTEM IMPORT WORD, LONGWORD, ADR, BYTE, ADDRESS;
  15. IMPORT Terminal, InOutBase;
  16. FROM Strings IMPORT Delete;
  17. FROM MOSGlobals IMPORT MemArea;
  18. FROM ResCtrl IMPORT RemovalCarrier, CatchRemoval;
  19.  
  20. CONST
  21.   ConfirmClose = FALSE;  (* TRUE -> Bei Prg-Ende wird auf Taste gewartet *)
  22.  
  23.  
  24. VAR ok: BOOLEAN; c: CHAR;
  25.     waitAtEnd: BOOLEAN;
  26.  
  27. PROCEDURE Open (x,y: CARDINAL);
  28.   BEGIN
  29.     waitAtEnd:= FALSE;
  30.   END Open;
  31.  
  32. PROCEDURE Close;
  33.   BEGIN
  34.     IF waitAtEnd & ConfirmClose THEN
  35.       (*
  36.        * Am Programmende auf Tastendruck warten,
  37.        * wenn zuletzt Ausgaben gemacht wurden, die sonst nicht mehr
  38.        * gesehen würden.
  39.        *)
  40.       waitAtEnd:= FALSE;
  41.       Terminal.Read (c)
  42.     END
  43.   END Close;
  44.  
  45. PROCEDURE Read (VAR c: CHAR);
  46.   BEGIN
  47.     waitAtEnd:= FALSE;
  48.     Terminal.Read (c)
  49.   END Read;
  50.  
  51. PROCEDURE Write (c: CHAR);
  52.   BEGIN
  53.     waitAtEnd:= TRUE;
  54.     Terminal.Write (c)
  55.   END Write;
  56.  
  57. PROCEDURE ReadString (VAR c:ARRAY OF CHAR);
  58.   BEGIN
  59.     waitAtEnd:= FALSE;
  60.     Terminal.ReadString (c);
  61.     Terminal.WriteLn
  62.   END ReadString;
  63.  
  64. PROCEDURE WriteString (REF s: ARRAY OF CHAR);
  65.   BEGIN
  66.     waitAtEnd:= TRUE;
  67.     Terminal.WriteString (s)
  68.   END WriteString;
  69.  
  70. PROCEDURE GetInput ( VAR name: ARRAY OF CHAR );
  71.   BEGIN
  72.     ReadString (name);
  73.   END GetInput;
  74.  
  75. PROCEDURE GetOutput ( VAR name: ARRAY OF CHAR; VAR append: BOOLEAN );
  76.   BEGIN
  77.     ReadString (name);
  78.     append:= name[0] = '>';
  79.     IF append THEN
  80.       Delete (name,0,1,ok)
  81.     END;
  82.   END GetOutput;
  83.  
  84. PROCEDURE OpenError ( VAR msg: ARRAY OF CHAR; VAR retry: BOOLEAN );
  85.   VAR c: CHAR;
  86.   BEGIN
  87.     Terminal.WriteLn;
  88.     Terminal.WriteString ('Fehler beim Öffnen: ');
  89.     Terminal.WriteString (msg);
  90.     Terminal.WriteLn;
  91.     Terminal.WriteString ('Nochmalige Eingabe ? (J/N) ');
  92.     REPEAT
  93.       Terminal.BusyRead (c);
  94.       c:= CAP (c)
  95.     UNTIL (c='J') OR (c='N');
  96.     retry:= c='J';
  97.     Terminal.WriteLn;
  98.   END OpenError;
  99.  
  100. PROCEDURE IOError ( VAR msg: ARRAY OF CHAR; input: BOOLEAN );
  101.   VAR c: CHAR;
  102.   BEGIN
  103.     Terminal.WriteLn;
  104.     Terminal.WriteString ('Fehler bei Datei');
  105.     IF input THEN
  106.       Terminal.WriteString ('eingabe: ')
  107.     ELSE
  108.       Terminal.WriteString ('ausgabe: ')
  109.     END;
  110.     Terminal.WriteString (msg);
  111.     Terminal.WriteLn;
  112.     Terminal.WriteString ('Datei wird geschlossen. Bitte Taste drücken. ');
  113.     Terminal.FlushKbd;
  114.     REPEAT
  115.       Terminal.BusyRead (c);
  116.     UNTIL c#0C;
  117.     Terminal.WriteLn;
  118.   END IOError;
  119.  
  120.  
  121. VAR pbuf: ARRAY [0..14] OF LONGWORD; pidx: CARDINAL;
  122.  
  123.  
  124. PROCEDURE pset (f:BOOLEAN);
  125.   PROCEDURE pswap (VAR l:LONGWORD; v:LONGWORD);
  126.     (*$R+*)
  127.     BEGIN
  128.       IF f THEN pbuf [pidx]:= l; l:= v ELSE l:= pbuf [pidx] END;
  129.       INC (pidx)
  130.     END pswap;
  131.     (*$R=*)
  132.   BEGIN
  133.     pidx:= 0;
  134.     pswap (InOutBase.Read, ADDRESS (Read));
  135.     pswap (InOutBase.Write, ADDRESS (Write));
  136.     pswap (InOutBase.OpenWdw, ADDRESS (Open));
  137.     pswap (InOutBase.CloseWdw, ADDRESS (Close));
  138.     pswap (InOutBase.KeyPressed, ADDRESS (Terminal.KeyPressed));
  139.     pswap (InOutBase.CondRead, ADDRESS (Terminal.CondRead));
  140.     pswap (InOutBase.WriteLn, ADDRESS (Terminal.WriteLn));
  141.     pswap (InOutBase.WritePg, ADDRESS (Terminal.WritePg));
  142.     pswap (InOutBase.WriteString, ADDRESS (WriteString));
  143.     pswap (InOutBase.ReadString, ADDRESS (ReadString));
  144.     pswap (InOutBase.GotoXY, ADDRESS (Terminal.GotoXY));
  145.     pswap (InOutBase.GetInput, ADDRESS (GetInput));
  146.     pswap (InOutBase.GetOutput, ADDRESS (GetOutput));
  147.     pswap (InOutBase.OpenError, ADDRESS (OpenError));
  148.     pswap (InOutBase.IOError, ADDRESS (IOError));
  149.   END pset;
  150.  
  151. PROCEDURE restore;
  152.   BEGIN
  153.     pset (FALSE) (* Wiederherstellen der alten PROC-Werte *)
  154.   END restore;
  155.  
  156. VAR tc: RemovalCarrier; st: MemArea;
  157.  
  158. BEGIN
  159.   CatchRemoval (tc, restore, st);
  160.   pset (TRUE)   (* Retten der alten PROC-Werte und Setzen der Neuen *)
  161. END TOSIO.
  162.